/**
  ******************************************************************************
  * @file    OLED_SSD1315_Config.h
  * @brief   OLED SSD1315驱动配置头文件（定义常量、宏及函数接口）
  * @author  18408107475@163.com
  * @version V1.0.0
  * @date    2025-6-15
  * @note    此文件定义了OLED驱动的核心参数、I2C通信配置及函数接口
  *          需配合OLED_SSD1315_Config.c和IIC_Simulate_Config.h使用
  ******************************************************************************
  */

#ifndef __OLED_SSD1315_CONFIG_H
#define __OLED_SSD1315_CONFIG_H

#include "stm32f10x.h"         // STM32F10x系列微控制器标准库
#include "stdbool.h"          // 布尔类型支持
#include <stdio.h>            // 标准输入输出库（用于snprintf等函数）
#include "IIC_Simulate_Config.h"  // 软件模拟I2C通信驱动

/*
 *	OLED I2C从设备地址配置
 *	0x78 是7位从设备地址（0x3C）左移1位后的值
 *	I2C协议中，7位地址+最低位读写标志 → 写操作时地址为0x3C << 1 = 0x78
 *	注：SSD1315默认地址为0x3C，若SA0引脚接高电平则地址为0x3D
 */
#define	OLED_SSD1315_SLAVE_ADDRESS	0x3C

/*
 *	I2C控制字节（区分命令和数据）
 *	0x00 表示后续发送的是命令（写入SSD1315命令寄存器）
 *	0x40 表示后续发送的是数据（写入显存或配置参数）
 */
#define WRITE_COMMAND				0x00
#define WRITE_DATA					0x40

/* 屏幕物理参数定义 */
#define OLED_WIDTH                 128    // 屏幕水平方向列数（0~127）
#define OLED_HEIGHT                64     // 屏幕垂直方向行数（0~63）
#define OLED_PAGE_NUM              8      // 显存页数（每页8行，64行=8页）

/* 模式选择宏（用于OLED_SSD1315_Dat_or_Cmd函数） */
#define OLED_CMD     0  // 命令模式（写入命令寄存器）
#define OLED_DATA    1  // 数据模式（写入显存或参数）

/* 基础I2C通信函数声明（底层时序控制） */
void OLED_SSD1315_Start(void);       // 产生I2C起始信号（SCL高时SDA下降沿）
void OLED_SSD1315_Stop(void);        // 产生I2C停止信号（SCL高时SDA上升沿）
bool OLED_SSD1315_Wait_ACK(void);    // 等待从机应答（检测SDA低电平）

/* 数据/命令传输函数声明 */
bool OLED_SSD1315_Write_Command(u8 cmd);  // 发送命令到OLED控制器
bool OLED_SSD1315_Write_Data(u8 data);    // 发送数据到OLED显存
void OLED_SSD1315_Dat_or_Cmd(u8 val, u8 mode); // 通用写入函数（根据mode选择命令/数据）

/* 屏幕控制函数声明 */
void OLED_SSD1315_Display_On(void);   // 开启显示（启用电荷泵和扫描）
void OLED_SSD1315_Display_Off(void);  // 关闭显示（停止扫描，降低功耗）
void OLED_SSD1315_Clear(void);        // 清屏（填充全0，所有像素熄灭）
void OLED_SSD1315_ON(void);           // 全屏点亮（填充全1，所有像素点亮，用于测试）

/* 显示控制函数声明 */
void OLED_SSD1315_Set_Pos(u8 x, u8 y);  // 设置显示起始位置（x=列，y=页）
bool OLED_SSD1315_FillScreen(u8 pattern); // 全屏填充指定图案（如0x00全黑，0xFF全亮）

/* 内容显示函数声明 */
void OLED_SSD1315_ShowChar(u8 x, u8 y, u8 chr, u8 size);  // 显示单个字符（ASCII）
void OLED_SSD1315_ShowString(u8 x, u8 y, const char* str, u8 size, bool wrap); // 显示字符串
void OLED_SSD1315_ShowNum(u8 x, u8 y, uint32_t num, u8 len, u8 size); // 显示定长数字（自动补零）
void OLED_SSD1315_ShowChinese(u8 x, u8 y, u8 index);      // 显示汉字（需字库支持）
bool OLED_SSD1315_DrawBitmap(u8 x0, u8 y0, u8 x1, u8 y1, const u8 *bmp); // 显示位图

/* 辅助功能函数声明 */
uint32_t OLED_Math_Pow(u8 base, u8 exponent);  // 快速计算整数幂（如10^3=1000）

/* 初始化函数声明 */
void OLED_SSD1315_Config(void);  // OLED控制器初始化（配置寄存器和显示参数）

#endif
